Record actions menu
canon⋮ actions of a record in the header and drawer, non-destructive first, destructive last.
Owner approved 6 Oct 2026 (acrm !4800, prototype proto/record-actions-menu@eabe09c8d): one trigger ⋮ (IconButton dots-vertical, default size) via kebabTrigger on person, company, deal, meeting, document, Datamart, project; order non-destructive → separator → Smazat last; no disabled Smazat; action menus fit the window height (fit-height). Dev check 7 Oct 2026: company detail 1440/390 light/dark, trigger 30 px, 5 items, Smazat last in --critical, phone sheet with Hotovo, brown 0. Usage + a11y docs written. Stories added in acrm !4923 (11 Oct 2026) → beta. 14 Oct 2026 (acrm !5055): project and order use the same ⋮ (RecordKebab); order Náhled / E-podpis / Smazat / Odeslat znovu live here. Canon 19 Oct 2026 (AD): dev check with real data on Firmy preview — 1440 light/dark: ⋮ 30×30 in the header after ↑ ↓ 1/50, menu Sloučit s jinou firmou… · Zkopírovat odkaz · Nastavení práv · Změnit vlastníka · separator · Smazat firmu (--critical); 390 light/dark: bottom sheet with grip, title „Další akce", same 5 items, full-width Hotovo, scrim; brown 0, page errors 0. Stories Default · States · Composition (acrm !4923).
Used in 8 files · 8 areas · 9× — pages/CompanyRecordPage, pages/FirmyPage, pages/LidePage, pages/MeetingDetailPage, pages/ObchodDetailPage, pages/PersonRecordPage …
Default
export const Default = () => <Open items={company()} />;States
export const States = () => (
<div style={row}>
<Labeled label="closed — the ⋮ trigger (IconButton dots-vertical, default size)">
<Menu items={company()} />
</Labeled>
<Labeled label="full rights — Smazat firmu last, behind the hairline, in --critical">
<Open items={company()} />
</Labeled>
<Labeled label="no right to delete or merge — the items are not drawn, never disabled">
<Open items={company({ canDelete: false, canMerge: false, canTransfer: false })} />
</Labeled>
<Labeled label="contextual Vytvořit objednávku first (only when it makes sense for the record)">
<Open items={company({ createOrder: true })} />
</Labeled>
<Labeled label="deals on the company — one named item per deal, narrower deletion first">
<Open items={company({ deals: ['Hypotéka 2026', 'Pojištění majetku'] })} width={280} />
</Labeled>
</div>
);Composition
export const Composition = () => (
<div style={{ display: 'grid', gap: 'var(--sp-6)' }}>
<Labeled label="in the detail header — identity · spacer · record arrows · ⋮ · ✕ (desktop)">
<div style={{ width: 720 }}>
<SectionTopBar
title={
<span className="tbar-id">
<Avatar name="Atol Solutions s.r.o." shape="square" size="lg" />
<span className="tbar-h">Atol Solutions s.r.o.</span>
</span>
}
>
<SectionTopBarSpacer />
<IconButton icon="chevron-up" aria-label="Předchozí záznam" />
<IconButton icon="chevron-down" aria-label="Další záznam" />
<Menu items={company()} />
<IconButton icon="x" aria-label="Zavřít" />
</SectionTopBar>
</div>
</Labeled>
<Labeled label="phone sheet — the view switch (with checks) on top, split by a hairline from the record actions (AD 1 Oct 2026)">
{/* Statická replika šuplíku (pod 720 px je nabídka BottomSheet). */}
<div className="acrm-sheet story-sheet" style={SHEET}>
<style>{`.story-sheet .acrm-popover-item { margin-inline: calc(-1 * var(--sp-3)); width: calc(100% + 2 * var(--sp-3)); }`}</style>
<div className="phe-sheethead">Další akce</div>
<MenuItems onDone={noop} items={PHONE} />
</div>
</Labeled>
</div>
);